home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 21
/
Cream of the Crop 21 (Terry Blount) (October 1996).iso
/
faq
/
vol15n14.zip
/
DDGAME.ZIP
/
SPACEFRA.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1996-04-17
|
20KB
|
797 lines
// SpaceFrame.cpp : implementation file
//
#include "stdafx.h"
#include "SpaceFrame.h"
#include "Error.h"
#include "animation.h"
#include <mmsystem.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
double DirX[32] =
{
0.000000,
0.195090,
0.382683,
0.555570,
0.707107,
0.831470,
0.923880,
0.980785,
1.000000,
0.980785,
0.923880,
0.831470,
0.707107,
0.555570,
0.382683,
0.195090,
0.000000,
-0.195090,
-0.382683,
-0.555570,
-0.707107,
-0.831470,
-0.923880,
-0.980785,
-1.000000,
-0.980785,
-0.923880,
-0.831470,
-0.707107,
-0.555570,
-0.382683,
-0.195090
};
double DirY[32] =
{
-1.0,
-0.980785,
-0.92388,
-0.83147,
-0.707107,
-0.55557,
-0.382683,
-0.19509,
0.0,
0.19509,
0.382683,
0.55557,
0.707107,
0.83147,
0.92388,
0.980785,
1.0,
0.980785,
0.92388,
0.83147,
0.707107,
0.55557,
0.382683,
0.19509,
0.0,
-0.19509,
-0.382683,
-0.55557,
-0.707107,
-0.83147,
-0.92388,
-0.980785
};
/////////////////////////////////////////////////////////////////////////////
// CSpaceFrame
//-----------------------------------------------------------------------------
// default constructor
//-----------------------------------------------------------------------------
CSpaceFrame::CSpaceFrame()
{
m_pFrameRateSurface = NULL;
m_dwStartTime = 0;
m_nFrameCount = 0;
m_nFrameRate= 0;
m_ddbltfx.dwSize = sizeof(DDBLTFX);
m_ddsd.dwSize = sizeof(DDSURFACEDESC);
m_nLives = 3;
m_nTurnDelay = 0;
m_nLevel = 0;
}
CSpaceFrame::~CSpaceFrame()
{
}
//-----------------------------------------------------------------------------
// GetWindowTitle
//-----------------------------------------------------------------------------
CString CSpaceFrame::GetWindowTitle()
{
return "Space Demo";
}
//-----------------------------------------------------------------------------
// UpdateGame
//-----------------------------------------------------------------------------
BOOL CSpaceFrame::UpdateGame()
{
// If its ESC, we quit the app
if (::GetAsyncKeyState(VK_ESCAPE) < 0)
{
return FALSE;
}
MoveSprites();
CollideSprites();
// out of lives, game over man
if (m_nLives <= 0)
{
DisplayMessage("Game Over");
return FALSE;
}
// Erase the background
m_ddbltfx.dwFillColor = 0;
while (TRUE)
{
HRESULT ddrval;
ddrval = m_pBackBuffer->Blt(NULL, NULL, NULL, DDBLT_COLORFILL, &m_ddbltfx);
if (ddrval == DD_OK)
break;
if (ddrval == DDERR_SURFACELOST)
if (!RestoreSurfaces())
return FALSE;
if (ddrval != DDERR_WASSTILLDRAWING)
break;
}
DrawSprites();
DrawText();
// Everyhting is ready in the back buffer, so flip
m_pFrontBuffer->Flip(NULL, DDFLIP_WAIT);
return TRUE;
}
//-----------------------------------------------------------------------------
// MoveSprites
//-----------------------------------------------------------------------------
void CSpaceFrame::MoveSprites()
{
SPRITE *pHold, *pCurr;
BOOL bCollision;
int nNumEnemies = 0;
pCurr = &m_head;
// move the sprites and detect edge of screen hits
do
{
switch (pCurr->eType)
{
case typeShip:
pCurr->nDelay++;
if (pCurr->nDelay >= ANIM_DELAY)
{
pCurr->nDelay = 0;
if (::GetAsyncKeyState(VK_CONTROL) < 0)
{
AddSprite(typeBullet, pCurr->dPosX, pCurr->dPosY);
}
}
if (::GetAsyncKeyState(VK_RIGHT) < 0)
{
if (m_nTurnDelay > TURN_DELAY)
{
m_nTurnDelay = 0;
++pCurr->nDirection;
if (pCurr->nDirection >= NUM_DIRECTIONS)
pCurr->nDirection = 0;
}
else
m_nTurnDelay++;
}
if (::GetAsyncKeyState(VK_LEFT) < 0)
{
if (m_nTurnDelay > TURN_DELAY)
{
m_nTurnDelay = 0;
--pCurr->nDirection;
if (pCurr->nDirection < 0)
pCurr->nDirection = NUM_DIRECTIONS - 1;
}
else
m_nTurnDelay++;
}
if (::GetAsyncKeyState(VK_UP) < 0)
{
pCurr->dVelX += DirX[pCurr->nDirection] / 10;
pCurr->dVelY += DirY[pCurr->nDirection] / 10;
}
if (::GetAsyncKeyState(VK_DOWN) < 0)
{
pCurr->dVelX = 0.0;
pCurr->dVelY = 0.0;
}
pCurr->dPosX += pCurr->dVelX;
pCurr->dPosY += pCurr->dVelY;
pCurr->nFrame = pCurr->nDirection;
break;
case typeEnemy:
nNumEnemies++;
case typeBullet:
pCurr->dPosX += pCurr->dVelX;
pCurr->dPosY += pCurr->dVelY;
pCurr->nDelay++;
if (pCurr->nDelay >= ANIM_DELAY)
{
pCurr->nDelay = 0;
pCurr->nFrame++;
if (pCurr->nFrame >= pCurr->pAnim->GetNumFrames())
pCurr->nFrame = 0;
}
break;
}
// reverse direction when hitting edge of world
bCollision = FALSE;
if (int(pCurr->dPosX) < WORLD_MIN_X)
{
pCurr->dVelX *= -1;
pCurr->dPosX = WORLD_MIN_X;
bCollision = TRUE;
}
if (int(pCurr->dPosY) < WORLD_MIN_Y)
{
pCurr->dVelY *= -1;
pCurr->dPosY = WORLD_MIN_Y;
bCollision = TRUE;
}
if ((int(pCurr->dPosX) + pCurr->pAnim->GetWidth()) > WORLD_MAX_X)
{
pCurr->dVelX *= -1;
pCurr->dPosX = WORLD_MAX_X - pCurr->pAnim->GetWidth();
bCollision = TRUE;
}
if ((int(pCurr->dPosY) + pCurr->pAnim->GetHeight()) > WORLD_MAX_Y)
{
pCurr->dVelY *= -1;
pCurr->dPosY = WORLD_MAX_Y - pCurr->pAnim->GetHeight();
bCollision = TRUE;
}
// remove bullets if they go off the edge of the world
if (typeBullet == pCurr->eType && bCollision)
{
pHold = pCurr->pNext;
RemoveSprite(pCurr);
pCurr = pHold;
}
else
pCurr = pCurr->pNext;
} while (pCurr != &m_head);
if (nNumEnemies == 0)
{
KillLevel();
InitLevel();
}
}
//-----------------------------------------------------------------------------
// CollideSprites
//-----------------------------------------------------------------------------
void CSpaceFrame::CollideSprites()
{
SPRITE *pHold, *pTarget, *pCurr;
BOOL bCollision;
pCurr = &m_head;
do
{
bCollision = FALSE;
if (pCurr->eType != typeBullet && pCurr->eType != typeShip)
{
pCurr = pCurr->pNext;
continue;
}
pTarget = m_head.pNext;
do
{
if (pTarget->eType == typeBullet || pTarget == pCurr)
{
pTarget = pTarget->pNext;
continue;
}
int nX = int(pCurr->dPosX) + (pCurr->pAnim->GetWidth() / 2);
int nY = int(pCurr->dPosY) + (pCurr->pAnim->GetHeight() / 2);
if (nX > pTarget->dPosX &&
nY > pTarget->dPosY &&
nX < (pTarget->dPosX + pTarget->pAnim->GetWidth()) &&
nY < (pTarget->dPosY + pTarget->pAnim->GetHeight()))
{
bCollision = TRUE;
pHold = pTarget->pNext;
RemoveSprite(pTarget);
pTarget = pHold;
}
else
pTarget = pTarget->pNext;
} while (pTarget != &m_head);
if (bCollision)
{
if (pCurr->eType == typeShip)
{
m_nLives--;
m_head.dPosX = 300.0;
m_head.dPosY = 200.0;
m_head.dVelX = 0.0;
m_head.dVelY = 0.0;
m_head.nDirection = m_head.nFrame = m_head.nDelay = 0;
}
else
{
pHold = pCurr->pNext;
RemoveSprite(pCurr);
pCurr = pHold;
}
}
else
pCurr = pCurr->pNext;
} while (pCurr != &m_head);
}
//-----------------------------------------------------------------------------
//